package wodegua.d22_stream;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 什么是Stream?
 * 也叫Stream流，是Jdk8开始新增的一套API(java.util.stream.*)，可以用于操作集合或者数组的数据。
 * 优势: Stream流大量的结合了Lambda的语法风格来编程，提供了一种更加强大，更加简单的方式操作集合或者数组中的数据，代码更简洁，可读性更好。
 *
 * Stream流常见的中间方法
 * Stream<T>filter(Predicate<?super T>predicate)    用于对流中的数据进行过滤。
 * Stream<I> sorted()    对元素进行升序排序
 * Stream<I>sorted(Comparator<?super I>comparator)   按照指定规则排序
 * Stream<T>limit(long maxSize)     获取前几个元素
 * Stream<T>skip(long n)     跳过前几个元素
 * Stream<T>distinct()     去除流中重复的元素。
 * <R>Stream<R> map(Function<?super I,? extends R> mapper)     对元素进行加工，并返回对应的新流
 * static<T>Stream<T>concat(Stream a,Stream b)     合并a和b两个流为一个流
 *
 * Stream流常见的终结方法
 * void forEach(Consumer action)    对此流运算后的元素执行遍历
 * long count()    统计此流运算后的元素个数
 * optional<T>max(Comparator<?super T>comparator)    获取此流运算后的最大值元素
 * Optional<T>min(Comparator<?super T>comparator)    获取此流运算后的最小值元素
 * 收集Stream流:就是把Stream流操作后的结果转回到集合或者数组中去返回。
 * Stream流:方便操作集合/数组的手段;集合/数组:才是开发中的目的，
 * R collect(collector collector)   把流处理后的结果收集到一个指定的集合中去
 * object[]toArray()   把流处理后的结果收集到一个数组中去
 *
 * Collectors工具类提供了具体的收集方式
 * public static<T>Collector toList()   把元素收集到List集合中
 * public static<T>Collector toset()   把元素收集到set集合中
 * public static Collector toMap(Function keyMapper ,Function valueMapper)   把元素收集到Map集合中
 */
public class StreamTest {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        Collections.addAll(names, "张三丰","张无忌","周芷若","赵敏","张强");

        List<String> s1 = names.stream().filter(s->s.startsWith("张") && s.length() == 3).collect(Collectors.toList());
        List<String> s2 = names.stream().filter(s->s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList());
        System.out.println(s1);
        System.out.println(s2);

        //找出姓票，且是3个字的名字，存入到一个新集合中去。
        List<String> list = new ArrayList<>();
        for(String name : names) {
            if (name.startsWith("张") && name.length() == 3) {
                list.add(name);
            }
        }
        System.out.println(list);

        //1、如何获取List集合的Stream流?
        Stream<String> r1 = names.stream();
        //2、如何获取Set集合的Stream流?
        Set<String> set = new HashSet<>();
        Collections.addAll(set,"刘德华","张曼玉","蜘蛛精","马德","德玛西亚");
        set.stream().filter(s-> s.contains("德")).forEach(s -> System.out.println(s));

        //3、如何获取Map集合的Stream流?
        Map<String,Double> map =new HashMap<>();map.put("古力娜扎",172.3);
        map.put("迪丽热巴",168.3);
        map.put("马尔扎哈",166.3);
        map.put("卡尔扎巴",168.3);
        List<Map.Entry<String,Double>> m1 = map.entrySet().stream().filter(s->s.getKey().contains("巴")).collect(Collectors.toList());
        System.out.println(m1);
        map.entrySet().stream().filter(s->s.getKey().contains("巴")).forEach(s-> System.out.println(s.getKey()+"--->"+s.getValue()));
        //4、如何获取数组的Stream流?
        String[] names2 ={"张翠山","东方不败","唐大山","独孤求败"};
        Stream<String> n1 = Arrays.stream(names2);
        Stream<String> n2 = Stream.of(names2);
    }
}
